/*
题目: 分隔回文串
给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。
https://leetcode.cn/problems/palindrome-partitioning/
 */
public class PartitionString {
    List< List<String> > result = new ArrayList<> ();
    Stack< String > stack = new Stack<> ();

    int n = 0;

    public List<List<String>> partition(String s) {
        n = s.length();
        backTrack(s, 0);
        return result;
    }

    private void backTrack(String s, int index) {
        if (index >= n) {
            result.add(new ArrayList<> (stack));
            return ;
        }
        String str = "";
        for (int i = index; i < n; i++) {
            str += s.charAt(i);
            if (isPalindrome(s, index, i)) { //这一步有点牛逼
                stack.push(str);
                backTrack(s, i + 1);
                stack.pop();
            } else {
                continue;
            }
        }
    }

    private boolean isPalindrome(String s, int start, int end) {
        while (start < end) {
            if (s.charAt(start) != s.charAt(end)) {
                return false;
            }
            start++;
            end--;
        }
        return true;
    }
}
